package com.cvpoc.hibernate.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.BeanUtils;
import org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.cvpoc.dto.FormationProfessionnelleDTO;
import com.cvpoc.hibernate.dao.FormationProfessionnelleDao;
import com.cvpoc.model.FormationProfessionnelle;

public class FormationProfessionnelleDaoImpl extends HibernateDaoSupport
		implements FormationProfessionnelleDao {

	@Override
	public Integer createFormationProfessionnelle(
			FormationProfessionnelleDTO pFormationProfessionnelleDTO) {
		FormationProfessionnelle formationProfessionnelle = getFormationProfessionnelle(pFormationProfessionnelleDTO);
		return (Integer) getHibernateTemplate().save(formationProfessionnelle);
	}

	@Override
	public FormationProfessionnelleDTO findFormationProfessionnelleById(
			int idFormationProfessionnelle) {
		FormationProfessionnelle formationProfessionnelle = null;
		try {
			formationProfessionnelle = getHibernateTemplate().get(
					FormationProfessionnelle.class, idFormationProfessionnelle);
		} catch (HibernateObjectRetrievalFailureException ex) {
			return null;
		}
		return getFormationProfessionnelleDTO(formationProfessionnelle);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<FormationProfessionnelleDTO> findListFormationProfessionnelleByIdCollaborateur(
			int idCollaborateur) {

		DetachedCriteria dc = DetachedCriteria
				.forClass(FormationProfessionnelle.class);
		dc.add(Restrictions.eq("id_collaborateur", idCollaborateur));

		List<FormationProfessionnelle> listeFormationsProfessionnelles = getHibernateTemplate()
				.findByCriteria(dc);
		return getListeFormationInitialeDTO(listeFormationsProfessionnelles);
	}

	@Override
	public void deleteFormationProfessionnelle(int pIdFormationProfessionnelle) {
		FormationProfessionnelle formationProfessionnelle = getHibernateTemplate()
				.load(FormationProfessionnelle.class,
						pIdFormationProfessionnelle);
		getHibernateTemplate().delete(formationProfessionnelle);
	}

	@Override
	public void updateFormationProfessionnelle(
			FormationProfessionnelleDTO pFormationProfessionnelleDTO) {
		FormationProfessionnelle formationProfessionnelle = getFormationProfessionnelle(pFormationProfessionnelleDTO);
		getHibernateTemplate().merge(formationProfessionnelle);
	}

	private static FormationProfessionnelleDTO getFormationProfessionnelleDTO(
			FormationProfessionnelle pFormationProfessionnelle) {
		if (pFormationProfessionnelle == null) {
			return null;
		}
		FormationProfessionnelleDTO formationProfessionnelleDTO = new FormationProfessionnelleDTO();
		BeanUtils.copyProperties(pFormationProfessionnelle,
				formationProfessionnelleDTO);
		return formationProfessionnelleDTO;

	}

	private static FormationProfessionnelle getFormationProfessionnelle(
			FormationProfessionnelleDTO pFormationProfessionnelleDTO) {
//		if (pFormationProfessionnelleDTO == null) {
//			return null;
//		}
		FormationProfessionnelle formationProfessionnelle = new FormationProfessionnelle();
		BeanUtils.copyProperties(pFormationProfessionnelleDTO,
				formationProfessionnelle);
		return formationProfessionnelle;
	}

	private static List<FormationProfessionnelleDTO> getListeFormationInitialeDTO(
			List<FormationProfessionnelle> pListeFormationProfessionnelles) {
		List<FormationProfessionnelleDTO> listeFormationProfessionnelleDTO = new ArrayList<FormationProfessionnelleDTO>();
		for (FormationProfessionnelle formationProfessionnelle : pListeFormationProfessionnelles) {
			listeFormationProfessionnelleDTO
					.add(getFormationProfessionnelleDTO(formationProfessionnelle));
		}
		return listeFormationProfessionnelleDTO;
	}
}
